// 02_wait_semaphore.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>

#define SEM_KEY 1234  // 定义信号灯集的键

int main() {
    int semid;
    struct sembuf sem_buf;

    // 获取现有的信号灯集
    semid = semget(SEM_KEY, 1, 0666);
    if (semid == -1) {
        perror("semget 获取信号灯集失败");
        exit(EXIT_FAILURE);
    }

    // 设置 P 操作（等待/减操作）
    sem_buf.sem_num = 0;  // 信号灯编号
    sem_buf.sem_op = -1;  // P 操作（减操作）
    sem_buf.sem_flg = SEM_UNDO;  // 操作完成后自动恢复

    printf("等待进入临界区...\n");
    if (semop(semid, &sem_buf, 1) == -1) {  // 执行 P 操作
        perror("semop 执行 P 操作失败");
        exit(EXIT_FAILURE);
    }

    printf("已进入临界区。\n");
    sleep(5);  // 模拟在临界区中工作

    return 0;
}